package ch.ebnoether.controller;

import ch.ebnoether.gui.WinnerCardLeft;
import ch.ebnoether.gui.WinnerCardRight;
import ch.ebnoether.wuerfel.Dice;

public class ControllerLogik implements YatzyConstants {

  public static int paschBerechnen(Dice[] dice, int pasch) {
    return paschSuchen(dice, pasch) ? summeWuerfel(dice) : ZERO;
  }

  public static boolean paschSuchen(Dice[] dice, int pasch) {
    return getSortedDices(dice)[ZERO] >= pasch;
  }

  public static int fullHouseBerechnen(Dice[] dice) {
    int[] sortiert = getSortedDices(dice);
    return (sortiert[ZERO] == THREE && sortiert[ONE] == TWO) ? FULL_HOUSE : ZERO;
  }

  public static int kleineStrasseBerechnen(Dice[] dices) {
    return (kleineStrasseSuchen(dices, ZERO) || kleineStrasseSuchen(dices, ONE) || kleineStrasseSuchen(dices, TWO)) ? KLEINE_STRASSE : ZERO;
  }

  public static boolean kleineStrasseSuchen(Dice[] dices, int erhoehung) {
    int[] gezaehlt = wuerfelArtZaehlen(dices);
    return (gezaehlt[erhoehung] >= ONE && gezaehlt[ONE + erhoehung] >= 1 && gezaehlt[TWO + erhoehung] >= ONE && gezaehlt[THREE + erhoehung] >= ONE);
  }

  public static int grosseStrasseBerechnen(Dice[] dices) {
    int[] gezaehlt = wuerfelArtZaehlen(dices);
    int[] sortiert = wuerfelArtenSortieren(gezaehlt);
    return (sortiert[FOUR] == ONE && (gezaehlt[ZERO] == ZERO || gezaehlt[FIVE] == ZERO)) ? GROSSE_STRASSE : ZERO;
  }

  public static int yatzyBerechnen(Dice[] dices) {
    return getSortedDices(dices)[ZERO] == FIVE ? YATZY : ZERO;
  }

  public static int chanceBerechnen(Dice[] dices) {
    return summeWuerfel(dices);
  }

  public static int summeWuerfel(Dice[] dices) {
    int summe = ZERO;
    for (Dice dice : dices) {
      summe += dice.getAugenzahl();
    }
    return summe;
  }

  public static int zaehleGleicheArt(Dice[] dices, int wuerfelArt) {
    int gleiche = ZERO;
    for (Dice dice : dices) {
      if (dice.getAugenzahl() == wuerfelArt) {
        gleiche += dice.getAugenzahl();
      }
    }
    return gleiche;
  }

  public static void setTotalLinks(WinnerCardLeft links, int gleiche) {
    int z = links.getTotalLeft() + gleiche;
    links.setTotalLeft(z);
    links.updatTotalLeft();
  }

  public static void setTotalRechts(WinnerCardRight rechts, int summe) {
    int z = rechts.getTotalRechts() + summe;
    rechts.setTotalRechts(z);
    rechts.setGesamtTotal(z + WinnerCardLeft.gesamtLinks);
    rechts.aktualisiereTotalRechts();
  }

  public static int[] wuerfelArtZaehlen(Dice[] dices) {
    int[] sortiert = new int[SIX];
    for (Dice dice : dices) {
      int a = dice.getAugenzahl();
      for (int j = ZERO; j < sortiert.length; j++) {
        if (a == j + ONE) {
          sortiert[j] += ONE;
          break;
        }
      }
    }
    return sortiert;
  }

  public static int[] wuerfelArtenSortieren(int[] z) {
    int[] sortiert = new int[SIX];
    int count = ZERO;
    for (int j = FIVE; j > ZERO; j--) {
      for (int i = ZERO; i < sortiert.length; i++) {
        int z1 = z[i];
        if (z1 == j) {
          sortiert[count] = z1;
          count++;
        }
      }
    }
    return sortiert;
  }

  private static int[] getSortedDices(Dice[] dice) {
    return wuerfelArtenSortieren(wuerfelArtZaehlen(dice));
  }
}
